home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Over 1,000 Windows 95 Programs
/
Over 1000 Windows 95 Programs (Microforum) (Disc 1).iso
/
1258
/
samples
/
stockstr.jav
< prev
next >
Wrap
Text File
|
1996-05-05
|
7KB
|
294 lines
/*
* @(#)StockStreamParser.java 1.10 95/12/09 Jim Graham
*
* Copyright (c) 1994-1995 Sun Microsystems, Inc. All Rights Reserved.
*
* Permission to use, copy, modify, and distribute this software
* and its documentation for NON-COMMERCIAL or COMMERCIAL purposes and
* without fee is hereby granted.
* Please refer to the file http://java.sun.com/copy_trademarks.html
* for further important copyright and trademark information and to
* http://java.sun.com/licensing.html for further important licensing
* information for the Java (tm) Technology.
*
* SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
* THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
* TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
* PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
* ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
* DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
*
* THIS SOFTWARE IS NOT DESIGNED OR INTENDED FOR USE OR RESALE AS ON-LINE
* CONTROL EQUIPMENT IN HAZARDOUS ENVIRONMENTS REQUIRING FAIL-SAFE
* PERFORMANCE, SUCH AS IN THE OPERATION OF NUCLEAR FACILITIES, AIRCRAFT
* NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL, DIRECT LIFE
* SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH THE FAILURE OF THE
* SOFTWARE COULD LEAD DIRECTLY TO DEATH, PERSONAL INJURY, OR SEVERE
* PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH RISK ACTIVITIES"). SUN
* SPECIFICALLY DISCLAIMS ANY EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR
* HIGH RISK ACTIVITIES.
*/
import java.io.InputStream;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.StreamTokenizer;
import java.util.Vector;
import java.util.StringTokenizer;
import java.net.URL;
import java.awt.Color;
/**
* A simple class to read a stock quote data stream and execute callbacks
* on the (StockWatcher) parent with the parsed data.
*
* @author Jim Graham
* @version 1.10, 12/09/95
*/
public class StockStreamParser implements Runnable {
int numURLs;
String dataURLs[];
boolean isStatic[];
String stocks;
StockWatcher watcher;
URL documentURL;
boolean canFudge;
int delay;
int history;
URL dataURL;
InputStream dataStream;
Thread kicker;
public StockStreamParser(StockWatcher parent, URL docURL,
boolean fudge, int d, int h) {
watcher = parent;
documentURL = docURL;
canFudge = fudge;
delay = d;
history = h;
Vector URLlist = new Vector();
String URLs = parent.getParameter("livedata");
int numLive = 0;
if (URLs != null) {
StringTokenizer st = new StringTokenizer(URLs, "|");
while (st.hasMoreTokens()) {
String nextURL = (String) st.nextToken();
URLlist.addElement(nextURL);
numLive++;
}
}
URLs = parent.getParameter("staticdata");
int numStatic = 0;
if (URLs != null) {
StringTokenizer st = new StringTokenizer(URLs, "|");
while (st.hasMoreTokens()) {
String nextURL = (String) st.nextToken();
URLlist.addElement(nextURL);
numStatic++;
}
}
if (numLive == 0 && numStatic == 0) {
URLs = parent.getParameter("data");
if (URLs == null) {
URLs = "http://benden:8888/stock.dat";
}
URLlist.addElement(URLs);
String s = parent.getParameter("static");
if (s != null && s.equals("true")) {
numStatic = 1;
} else {
numLive = 1;
}
}
numURLs = numLive + numStatic;
isStatic = new boolean[numURLs];
for (int i = 0; i < numURLs; i++) {
isStatic[i] = (i >= numLive);
}
dataURLs = new String[numURLs];
URLlist.copyInto(dataURLs);
}
public void setStock(String stock) {
stocks = "/" + stock;
}
public void setStock(String stock[]) {
stocks = "";
for (int i = 0; i < stock.length; i++) {
stocks += "/" + stock[i];
}
}
public void run() {
int index = 0;
boolean done = false;
while (kicker != null && !done) {
try {
String sendURL;
if (isStatic[index]) {
sendURL = dataURLs[index];
int percent = sendURL.indexOf("%");
if (percent >= 0) {
sendURL = sendURL.substring(0, percent) + stocks;
}
} else {
sendURL = dataURLs[index]
+ stocks
+ (canFudge ? "?f" : "?")
+ ((history == 0)
? ("dle," + delay)
: ("dhle," + delay + "," + history + "s"));
}
dataURL = new URL(documentURL, sendURL);
dataStream = new BufferedInputStream(dataURL.openStream());
done = true;
readStream(dataStream);
} catch(ThreadDeath td) {
done = true;
} catch(IOException e) {
//} catch(Exception e) {
//e.printStackTrace();
//close();
//throw e;
}
close();
if (!done) {
index++;
if (index == numURLs) {
index = 0;
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
done = true;
}
}
}
}
watcher.feedEOF(this);
System.out.println("Exitting");
}
public void start() {
kicker = new Thread(this);
kicker.setPriority(Thread.MIN_PRIORITY);
kicker.start();
}
public void stop() {
Thread t = kicker;
kicker = null;
t.stop();
close();
}
public synchronized void close() {
try {
dataStream.close();
} catch (Exception e) {
}
dataStream = null;
}
private static final int IGNORE = 0;
private static final int QUOTE = 1;
private static final int HIGH = 2;
private static final int LOW = 3;
private static final int CLOSE = 4;
private static final int HIST_TIME = 5;
private static final int HIST_VAL = 6;
private static final int ERROR = 7;
public void readStream(InputStream dataStream) throws IOException {
StreamTokenizer st = new StreamTokenizer(dataStream);
st.eolIsSignificant(false);
int nextval = IGNORE;
int histTime = 0;
String symbol = null;
while (kicker != null) {
if (dataStream.available() < 1) {
watcher.flushQuotes();
}
int tok = st.nextToken();
if (kicker == null) {
break;
}
switch (tok) {
case st.TT_EOF:
System.out.println("EOF "+stocks);
return;
case st.TT_NUMBER:
switch (nextval) {
case HIGH:
watcher.newHigh(symbol, st.nval);
break;
case LOW:
watcher.newLow(symbol, st.nval);
break;
case CLOSE:
watcher.newClose(symbol, st.nval);
break;
case HIST_TIME:
histTime = (int) st.nval;
nextval = HIST_VAL;
continue;
case HIST_VAL:
watcher.newQuote(symbol, st.nval, histTime);
break;
case QUOTE:
watcher.newQuote(symbol, st.nval);
break;
default:
System.out.println("Ignoring "+st.nval);
break;
}
nextval = IGNORE;
break;
case st.TT_WORD:
symbol = st.sval;
if (nextval == ERROR) {
watcher.setFeedError(symbol, true);
nextval = IGNORE;
} else {
if (nextval == IGNORE) {
nextval = QUOTE;
}
watcher.setFeedError(symbol, false);
}
break;
default:
int prefix = st.ttype;
switch (prefix) {
case '^':
nextval = HIGH;
break;
case '_':
nextval = LOW;
break;
case '<':
nextval = CLOSE;
break;
case '#':
nextval = ERROR;
break;
case '@':
nextval = HIST_TIME;
break;
case '*':
// Server side fudge indicator - ignore it...
break;
default:
System.out.println("Unknown quote token: "+st);
break;
}
break;
}
}
}
}